package com.gjw.designpattern.prototype;

/**
 * 原型模式
 * 两种表现形式：  1 简单形式 ； 2  登记形式 ；
 * 简单形式: 包含三种角色。
 * 1.客户角色：提出创建对象请求。
 * 2.抽象原型角色：具体原型类所需的接口 。通常为接口或抽象类实现。
 * 3.具体原型角色：被复制的对象，需要实现抽象原型角色。
 * 登记形式：包含四种角色。
 * 相比简单形式新加入了原型管理器角色：主要作用为创建具体原型类的对象， 以及记录每一个被创建的对象。
 *
 * 需要实现cloneable接口  重写clone方法（浅克隆）
 * 浅克隆：创建一个新对象，新对象的属性和原来对象完全相同，对于非基本类型属性，仍指向原有属性所指向的对象的内存地址
 *      Object.clone();
 * 深克隆：创建一个新对象，属性中引用的其他对象也会被克隆，不再指向原有对象地址。
 *      将对象序列化存入文件，再通过反序列化获得对象。（）
 *
 *原型模式通常适用于以下场景。
 * 1.对象之间相同或相似，即只是个别的几个属性不同的时候。
 * 2.创建对象成本较大，例如初始化时间长，占用CPU太多，或者占用网络资源太多等，需要优化资源。
 * 3.创建一个对象需要繁琐的数据准备或访问权限等，需要提高性能或者提高安全性。
 * 4.系统中大量使用该类对象，且各个调用者都需要给它的属性重新赋值。
 * 在 Spring 中，原型模式应用的非常广泛，例如 scope='prototype'、JSON.parseObject() 等都是原型模式的具体应用。
 */
public class Client {


    public static void main(String[] args) {
        Prototype prototype = new Prototype();
        prototype.setFileName("测试原型模式");

        try {
            Prototype prototype1 = (Prototype) prototype.clone();

            System.out.println(prototype == prototype1 ? true :false);
            System.out.println(prototype1.getFileName());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

}
